<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="VGUhs" id="VGUhs"><span data-lake-id="ufe428f4a" id="ufe428f4a">典型回答</span></h1>
  <p data-lake-id="u03cb0232" id="u03cb0232"><br></p>
  <p data-lake-id="ufc7ff654" id="ufc7ff654"><span data-lake-id="u3a520df1" id="u3a520df1">Git的代码回滚考察的是纯纯的实操了，根据代码所在的位置不同，回滚的方式也不一样。</span></p>
  <p data-lake-id="u855e74c5" id="u855e74c5"><span data-lake-id="u184b765e" id="u184b765e">​</span><br></p>
  <p data-lake-id="u8b9e39d9" id="u8b9e39d9"><span data-lake-id="u65a69315" id="u65a69315">一般一个文件要经历几个过程：</span></p>
  <p data-lake-id="u6b64f3d0" id="u6b64f3d0"><span data-lake-id="u44228790" id="u44228790">​</span><br></p>
  <p data-lake-id="u56d27bb5" id="u56d27bb5"><span data-lake-id="u795f46b6" id="u795f46b6">本地文件修改 -&gt; commit到分支上 -&gt; push到仓库中</span></p>
  <p data-lake-id="u495ade3d" id="u495ade3d"><span data-lake-id="u247e999d" id="u247e999d">​</span><br></p>
  <p data-lake-id="u4e9299e2" id="u4e9299e2"><span data-lake-id="ua33cbe16" id="ua33cbe16">首先，说</span><strong><span data-lake-id="u41b01c86" id="u41b01c86">本地文件修改</span></strong><span data-lake-id="u7e4ab3db" id="u7e4ab3db">，如果你只是想撤销本地文件的修改并恢复到上一次提交时的状态，可以使用</span><code data-lake-id="ue05b3a2b" id="ue05b3a2b"><strong><span data-lake-id="u795c0ddc" id="u795c0ddc">git checkout</span></strong></code><span data-lake-id="u8b0644f2" id="u8b0644f2">命令。例如，如果你想撤销对文件example.txt的修改，可以运行以下命令：</span><code data-lake-id="u7a399d4e" id="u7a399d4e"><span data-lake-id="u851f7b33" id="u851f7b33">git checkout example.txt</span></code><span data-lake-id="u760d745d" id="u760d745d">。</span></p>
  <p data-lake-id="uf71dd506" id="uf71dd506"><span data-lake-id="u716f99d4" id="u716f99d4">​</span><br></p>
  <p data-lake-id="u4d126739" id="u4d126739"><span data-lake-id="uc736f331" id="uc736f331">如果你的代码本地修改后，使用了git</span><strong><span data-lake-id="u18cea9f2" id="u18cea9f2"> commit或者push提交到了分支上</span></strong><span data-lake-id="u5ceca581" id="u5ceca581">，想要撤销这一次的提交的话，那么可以使用</span><code data-lake-id="u66833418" id="u66833418"><strong><span data-lake-id="uac255258" id="uac255258">git revert</span></strong></code><span data-lake-id="u8cca10e3" id="u8cca10e3">和</span><code data-lake-id="uedfe904e" id="uedfe904e"><strong><span data-lake-id="ua7cbc760" id="ua7cbc760">git reset</span></strong></code><span data-lake-id="udf785a51" id="udf785a51">命令。</span></p>
  <p data-lake-id="u28216169" id="u28216169"><span data-lake-id="ub2bba653" id="ub2bba653">​</span><br></p>
  <p data-lake-id="u9b9d2a58" id="u9b9d2a58"><span data-lake-id="ud19e755b" id="ud19e755b">例如，如果你想撤销指定的某一次提交，如这次提交的hash值是abcdefg，可以运行以下命令：</span><code data-lake-id="udf3edf27" id="udf3edf27"><span data-lake-id="u4c52eebc" id="u4c52eebc">git revert abcdefg</span></code><span data-lake-id="u1b0c9832" id="u1b0c9832">或者 </span><code data-lake-id="u16ac4509" id="u16ac4509"><span data-lake-id="ubfcfae55" id="ubfcfae55">git reset --hard abcdefg</span></code><span data-lake-id="u8738df49" id="u8738df49">。</span></p>
  <p data-lake-id="ua70d7ae9" id="ua70d7ae9"><span data-lake-id="u1f52493a" id="u1f52493a">​</span><br></p>
  <p data-lake-id="u0ade64c9" id="u0ade64c9"><span data-lake-id="u0f92c55b" id="u0f92c55b">​</span><br></p>
  <h1 data-lake-id="SEeYr" id="SEeYr"><span data-lake-id="ubf6dc610" id="ubf6dc610">扩展知识</span></h1>
  <p data-lake-id="udf500e59" id="udf500e59"><br></p>
  <h2 data-lake-id="zbSwf" id="zbSwf"><span data-lake-id="u08513036" id="u08513036">revert和reset的区别</span></h2>
  <p data-lake-id="ue77f5196" id="ue77f5196"><br></p>
  <p data-lake-id="u2ba6a313" id="u2ba6a313"><span data-lake-id="ub24e7fcd" id="ub24e7fcd">revert和reset都能用来回退git的提交，那么他们的区别是什么呢？</span></p>
  <p data-lake-id="ude976d56" id="ude976d56"><span data-lake-id="u3c3198ac" id="u3c3198ac">​</span><br></p>
  <p data-lake-id="ueeec643c" id="ueeec643c"><span data-lake-id="ub479da85" id="ub479da85">reset的回退比较暴力，是彻底回退到指定的版本。并且执行的本次reset动作也没有产生记录，就像一切都没有发生过一样，如果使用--hard的话，还会把这次提交之后的所有其他提交也都一并清除。</span></p>
  <p data-lake-id="u72eb1a64" id="u72eb1a64"><span data-lake-id="u20b29da8" id="u20b29da8">​</span><br></p>
  <p data-lake-id="u7c5d0360" id="u7c5d0360"><span data-lake-id="u4913f7ea" id="u4913f7ea">而revert是仅仅撤销指定的那一次修改，对于这次commit之后的commit其实是没有影响的。使用 revert会保留更改历史记录，并且可以反复使用以前的更改。每个撤消提交都会添加到历史记录中，并且必须将其合并到目标分支中。</span></p>
  <p data-lake-id="u72745c02" id="u72745c02"><br></p>
  <h2 data-lake-id="ou9Ea" id="ou9Ea"><span data-lake-id="u2d3aec63" id="u2d3aec63">reset 的三种模式</span></h2>
  <p data-lake-id="u47b69abb" id="u47b69abb"><br></p>
  <p data-lake-id="ucda9ddd5" id="ucda9ddd5"><span data-lake-id="uc031fc8c" id="uc031fc8c">reset命令有三种模式，分别是soft、mixed和hard。</span></p>
  <p data-lake-id="u677c3328" id="u677c3328"><span data-lake-id="u2f452b4e" id="u2f452b4e">​</span><br></p>
  <ul list="u5a061f28">
   <li fid="ua6106b74" data-lake-id="u67862242" id="u67862242"><span data-lake-id="u29cd1fc1" id="u29cd1fc1">--soft 模式会重置指针，但不会修改工作目录或索引。这意味着之前的更改仍然存在于工作区中，并且可以重新提交。</span></li>
  </ul>
  <p data-lake-id="uef615586" id="uef615586"><br></p>
  <ul list="u5a061f28" start="2">
   <li fid="ua6106b74" data-lake-id="u0b6ffb7b" id="u0b6ffb7b"><span data-lake-id="u1064b7f3" id="u1064b7f3">--mixed</span><span data-lake-id="uc4b83a39" id="uc4b83a39"> 模式是默认模式，它重置指针并更新索引以匹配指定的提交。这将取消索引中的所有更改，但工作目录中的更改将保留。</span></li>
  </ul>
  <p data-lake-id="u1753e03c" id="u1753e03c"><br></p>
  <ul list="u5a061f28" start="3">
   <li fid="ua6106b74" data-lake-id="uf703aad9" id="uf703aad9"><span data-lake-id="uedff68f6" id="uedff68f6">--hard 模式会重置指针，索引和工作区。这意味着所有更改都将永久删除，并且没有办法撤销或恢复这些更改。</span></li>
  </ul>
 </body>
</html>